package org.nf.vrs.authenticateservice.util;

import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import lombok.extern.slf4j.Slf4j;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
import java.util.UUID;

/**
 * @author duang
 * @date 2022/3/30
 */
@Slf4j
public class JwtUtils {
    /**
     * 密钥，用于signature（签名）部分解密
     */
    private static final String KEY = "chen-juan";

    /**
     * 签发者
     */
    private static final String ISS = "org.nf";


    /**
     * 创建token过期时间
     * @param ttl
     * @return
     */
    private static Date getExpDate(long ttl) {
        Date expDate = new Date(System.currentTimeMillis() + ttl);
        log.info("Token过期时间：" + new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(expDate));
        return expDate;
    }

    /**
     * 获取载体内容
     * @param token
     * @param name
     * @param type
     * @param <T>
     * @return
     */
    public static <T> T getPayload(String token, String name, Class<T> type) {
        return Jwts.parser()
                .setSigningKey(KEY)
                .parseClaimsJws(token)
                .getBody()
                .get(name, type);
    }

    /**
     * 验证token的有效性
     * @param token
     */
    public static void verify(String token) {
        Jwts.parser().setSigningKey(KEY).parseClaimsJws(token);
    }

    /**
     * 生成token
     * @param claims
     * @param ttl
     * @return
     */
    public static String createToken(Map<String,Object> claims, long ttl) {
        JwtBuilder builder = Jwts.builder()
                // 获取签名密钥，并采用HS512算法对JWT进行签名
                .signWith(SignatureAlgorithm.HS512, KEY)
                // jwt唯一标识
                .setId(UUID.randomUUID().toString())
                // 设置需要签署的名称
                .setClaims(claims)
                // 设置发证人
                .setIssuer(ISS)
                // 主题
                .setSubject("JWT_AUTH")
                // 签名时间航科
                .setIssuedAt(new Date());

        // 过期时间
        if (ttl>=0) {
            builder.setExpiration(getExpDate(ttl));
        }

        return builder.compact();
    }
}